9.1: Preferensi Bersama
Materi:
- Preferensi bersama vs. keadaan instance tersimpan
- Membuat preferensi bersama file
- Menyimpan preferensi bersama
- Memulihkan preferensi bersama
- Mengosongkan preferensi bersama
- Mendengarkan perubahan preferensi
- Praktik terkait
Preferensi bersama memungkinkan Anda membaca dan menulis data primitif dalam jumlah kecil sebagai pasangan kunci/nilai ke file pada storage perangkat. Kelas SharedPreference menyediakan API untuk mendapatkan handle ke file preferensi serta untuk membaca, menulis, dan mengelola data ini. File preferensi bersama ini sendiri dikelola oleh kerangka kerja dan bisa diakses (digunakan bersama) oleh semua komponen aplikasi Anda. Data tersebut tidak digunakan bersama atau bisa diakses oleh aplikasi lainnya.
Untuk mengelola data dalam jumlah besar, gunakan database SQLite atau opsi storage lainnya yang cocok, yang akan dibahas dalam bab berikutnya.
Preferensi bersama vs. keadaan instance tersimpan
Dalam bab sebelumnya, Anda telah mempelajari tentang mempertahankan keadaan dengan menggunakan keadaan instance tersimpan. Inilah perbandingan di antara keduanya.
Preferensi Bersama |
Keadaan instance tersimpan |
Bertahan di semua sesi pengguna, meskipun aplikasi Anda ditutup dan dimulai ulang, atau perangkat di-boot ulang. |
Mempertahankan data keadaan di seluruh instance aktivitas dalam sesi pengguna yang sama. |
Data yang harus diingat di semua sesi, misalnya setelan pilihan pengguna atau skor game mereka. |
Data yang tidak boleh diingat di semua sesi, misalnya tab yang dipilih, atau keadaan aktivitas saat ini. |
Sejumlah kecil pasangan kunci/nilai |
Sejumlah kecil pasangan kunci/nilai |
Data bersifat privat untuk aplikasi. |
Data bersifat privat untuk aplikasi. |
Penggunaan umumnya adalah untuk menyimpan preferensi pengguna. |
Kita biasanya membuat ulang keadaan setelah perangkat diputar. |
Membuat file preferensi bersama file
Anda hanya memerlukan satu file preferensi bersama untuk aplikasi, dan biasanya diberi nama dengan nama paket aplikasi. Hal ini membuat namanya unik dan mudah dikaitkan dengan aplikasi Anda.
Anda membuat file preferensi bersama dalam metode onCreate() aktivitas utama dan menyimpannya dalam sebuah variabel anggota.
private String sharedPrefFile = "com.example.android.hellosharedprefs";
mPreferences = getSharedPreferences(sharedPrefFile, MODE_PRIVATE);
Diperlukan argumen mode, karena Android versi lama memiliki mode lain yang memungkinkan Anda membuat file preferensi bersama yang bisa dibaca dan ditulis oleh umum. Mode ini tidak digunakan lagi di API 17, dan sekarang sangat tidak dianjurkan karena alasan keamanan. Jika Anda perlu berbagi data dengan aplikasi lainnya, gunakan layanan atau penyedia materi.
Menyimpan preferensi bersama
Anda menyimpan preferensi dalam keadaan onPause() daur hidup aktivitas dengan menggunakan antarmuka SharedPreferences.Editor.
- Dapatkan SharedPreferences.Editor. Editor menangani semua operasi file untuk Anda. Bila dua editor memodifikasi preferensi pada waktu yang sama, maka yang terakhir dipanggil akan menang.
- Tambahkan pasangan kunci/nilai ke editor dengan menggunakan metode put yang sesuai untuk tipe data tersebut. Metode put akan menimpa nilai yang ada sebelumnya pada kunci yang ada.
Panggil apply() untuk menuliskan perubahan Anda. Metode apply() menyimpan preferensi secara asinkron, di luar thread UI. Editor preferensi bersama juga memiliki metode commit() untuk menyimpan preferensi secara sinkron. Metode commit() tidak disarankan karena bisa memblokir operasi lain. Karena instance SharedPreferences adalah singleton dalam suatu proses, maka aman untuk mengganti instance commit() dengan apply() jika Anda sudah mengabaikan nilai kembalian.
Anda tidak perlu mengkhawatirkan daur hidup komponen Android dan interaksinya dengan penulisan apply() ke disk. Kerangka kerja memastikan penulisan disk yang sedang diakses dari apply() selesai sebelum mengubah keadaan.
@Override
protected void onPause() {
super.onPause();
SharedPreferences.Editor preferencesEditor = mPreferences.edit();
preferencesEditor.putInt("count", mCount);
preferencesEditor.putInt("color", mCurrentColor);
preferencesEditor.apply();
}
Memulihkan preferensi bersama
Anda memulihkan preferensi bersama dalam metode onCreate() aktivitas. Metode get() mengambil dua argumen— satu untuk kunci dan satu lagi untuk nilai default jika kunci tidak bisa ditemukan. Dengan menggunakan argumen default, Anda tidak perlu menguji apakah preferensi ada dalam file.
mPreferences = getSharedPreferences(sharedPrefFile, MODE_PRIVATE);
if (savedInstanceState != null) {
mCount = mPreferences.getInt("count", 1);
mShowCount.setText(String.format("%s", mCount));
mCurrentColor = mPreferences.getInt("color", mCurrentColor);
mShowCount.setBackgroundColor(mCurrentColor);
} else { … }
Mengosongkan preferensi bersama
Untuk mengosongkan semua nilai dalam file preferensi bersama, panggil metode clear() pada editor preferensi bersama dan terapkan perubahan.
SharedPreferences.Editor preferencesEditor = mPreferences.edit();
preferencesEditor.putInt("number", 42);
preferencesEditor.clear();
preferencesEditor.apply();
Anda bisa mengombinasikan panggilan untuk put dan clear. Akan tetapi, saat menerapkan preferensi, clear selalu dilakukan terlebih dahulu, tanpa menghiraukan apakah Anda memanggil metode clear sebelum atau setelah metode put pada editor ini.
Mendengarkan perubahan preferensi
Ada sejumlah alasan yang membuat Anda perlu diberi tahu segera setelah pengguna mengubah salah satu preferensi. Untuk menerima callback saat perubahan terjadi pada salah satu preferensi, implementasikan antarmuka SharedPreference.OnSharedPreferenceChangeListener dan daftarkan listener untuk objek SharedPreferences dengan memanggil registerOnSharedPreferenceChangeListener().
Antarmuka tersebut hanya memiliki satu metode callback, onSharedPreferenceChanged(), dan Anda bisa mengimplementasikan antarmuka sebagai bagian dari aktivitas.
public class SettingsActivity extends PreferenceActivity
implements OnSharedPreferenceChangeListener {
public static final String KEY_PREF_SYNC_CONN = "pref_syncConnectionType";
...
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
if (key.equals(KEY_PREF_SYNC_CONN)) {
Preference connectionPref = findPreference(key);
// Set summary to be the user-description for the selected value
connectionPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
Dalam contoh ini, metode akan memeriksa apakah setelan yang diubah adalah untuk kunci preferensi yang diketahui. Ini akan memanggil findPreference() untuk mendapatkan objek Preference yang diubah agar bisa memodifikasi rangkuman item menjadi keterangan pilihan pengguna.
Untuk pengelolaan daur hidup yang tepat dalam aktivitas, daftarkan dan cabut pendaftaran SharedPreferences.OnSharedPreferenceChangeListener Anda, masing-masing selama callback onResume() dan onPause():
@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
Menahan referensi ke listener
Bila Anda memanggil registerOnSharedPreferenceChangeListener(), pengelola preferensi saat ini tidak akan langsung menyimpan referensi ke listener. Anda harus menahan referensi ke listener, atau referensi akan rentan terhadap pengumpulan sampah. Pertahankan referensi ke listener dalam data instance suatu objek yang akan ada selama Anda memerlukan listener.
SharedPreferences.OnSharedPreferenceChangeListener listener =
new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// listener implementation
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
Praktik terkait
Latihan terkait dan dokumentasi praktik ada di Dasar-Dasar Developer Android: Praktik.
Ketahui selengkapnya
- Menyimpan Data
- Opsi Storage
- Menyimpan Rangkaian Nilai-Kunci
- SharedPreferences
- SharedPreferences.Editor
Stackoverflow